package com.settlement.system.common.util.common;

import cn.hutool.core.util.RandomUtil;
import com.settlement.system.common.enums.GenRedisKeyEnum;
import org.apache.commons.lang3.StringUtils;

import java.text.MessageFormat;
import java.util.Date;

/**
 * 生成序号工具
 * @author hc
 * @since 2022/4/7
 */
public class GenSerialUtil {


    /**
     * 生成流水号
     * @return 流水号
     */
    public static String genSerialNo(){
        //加上时间戳 如果不需要
        String datetime = DateUtil.format(new Date(),"yyyyMMdd");
        //查询 key 是否存在， 不存在返回 1 ，存在的话则自增加1
        String key=StrUtil.append(GenRedisKeyEnum.SERIAL_NO.getKey(),datetime);
        long incr = RedisUtil.incr(key, 1);
        //这里是 4 位id，如果位数不够可以自行修改 ，下面的意思是 得到上面 key 的 值，位数为 4 ，不够的话在左边补 0 ，比如  110 会变成  0110
        String value = StringUtils.leftPad(String.valueOf(incr), 6, "0");
        //然后把 时间戳和优化后的 ID 拼接
        String code = MessageFormat.format("{0}{1}",  GenRedisKeyEnum.SERIAL_NO.getPrefix() + datetime,value);
        //设置2天过期
        RedisUtil.expire(key,2*86400);
        return code;
    }

    /**
     * 生成NC订单号
     * @param accountBook 核算账簿
     * @param editorDate 制单日期
     * @return 订单号
     */
    public static String genOrderNo(String accountBook, Date editorDate) {
        String datetime = DateUtil.format(new Date(),"yyyyMMdd");
        //查询 key 是否存在， 不存在返回 1 ，存在的话则自增加1
        String key=StrUtil.append(GenRedisKeyEnum.ORDER_NO.getKey(),datetime);
        long incr = RedisUtil.incr(key, 1);
        //这里是 4 位id，如果位数不够可以自行修改 ，下面的意思是 得到上面 key 的 值，位数为 4 ，不够的话在左边补 0 ，比如  110 会变成  0110
        String value = StringUtils.leftPad(String.valueOf(incr), 6, "0");
        //然后把 时间戳和优化后的 ID 拼接
        String code = MessageFormat.format("{0}{1}",  GenRedisKeyEnum.ORDER_NO.getPrefix()+accountBook +"-"+datetime,value);
        //设置2天过期
        RedisUtil.expire(key,2*86400);
        return code.replaceAll("-","");
    }
}
